﻿using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using ICSharpCode.AvalonEdit.Highlighting;
using Clipboard = System.Windows.Clipboard;
using DataFormats = System.Windows.DataFormats;
using DataObject = System.Windows.DataObject;
using MessageBox = System.Windows.MessageBox;

namespace MyEditor;

public partial class MainWindow : Window
{
    private MultiSelectTreeViewHelper multiSelectHelper;
    private string currentFilePath;

    public MainWindow()
    {
        InitializeComponent();

        // 窗口加载后自动触发收藏目录逻辑
        this.Loaded += MainWindow_Loaded;

        // 初始化多选封装
        multiSelectHelper = new MultiSelectTreeViewHelper(FolderTreeView);

        // 绑定TreeView选择事件来显示文件内容
        FolderTreeView.SelectedItemChanged += FolderTreeView_SelectedItemChanged;

        // 绑定快捷键 Ctrl+C 复制文件
        this.InputBindings.Add(new KeyBinding(new RelayCommand(o => multiSelectHelper.CopyFiles()),
            Key.C, ModifierKeys.Control));

        // 绑定快捷键 Ctrl+Shift+C 复制文件名
        this.InputBindings.Add(new KeyBinding(new RelayCommand(o => multiSelectHelper.CopyFileNames()),
            Key.C, ModifierKeys.Control | ModifierKeys.Shift));

        // 绑定快捷键 Ctrl+S 保存文件  (放弃)
        // this.InputBindings.Add(new KeyBinding(new RelayCommand(o => SaveFile()),
            // Key.S, ModifierKeys.Control));

        // 绑定快捷键 Ctrl+Shift+S 另存为  (放弃)
        // this.InputBindings.Add(new KeyBinding(new RelayCommand(o => SaveAsFile()),
            // Key.S, ModifierKeys.Control | ModifierKeys.Shift));


        // 判断是否从命令行参数打开文件夹 (右键菜单打开文件夹)
        string[] args = Environment.GetCommandLineArgs();
        // 正常模式（打开文件夹）
        if (args.Length > 1)
        {
            string folderPath = args[1];
            LoadDirectory(folderPath);
        }
        else
        {
            // No folder selected
        }
        
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // 直接调用你的方法
        collectFolder_Click(null, null);
    }

        
    
    // 收藏目录
    private void collectFolder_Click(object sender, RoutedEventArgs e)
    {
        string filePath = @"C:\YXB\specialFolderList.txt";

        if (!File.Exists(filePath))
        {
            MessageBox.Show("文件不存在: " + filePath);
            return;
        }

        // 读取所有目录行（过滤空行）
        var folders = File.ReadAllLines(filePath)
                            .Select(l => l.Trim().Trim(','))  // 去掉空格和末尾逗号
                            .Where(l => !string.IsNullOrWhiteSpace(l))
                            .ToList();

        if (folders.Count == 0)
        {
            MessageBox.Show("文件中未找到目录。");
            return;
        }

        // 弹出选择窗口
        var win = new FolderSelectWindow(folders);
        if (win.ShowDialog() == true)
        {
            string chosenFolder = win.SelectedFolder;

            if (!string.IsNullOrEmpty(chosenFolder))
            {
                // MessageBox.Show("你选择了: " + chosenFolder);
                // TODO: 在这里调用“打开目录”的业务逻辑
                // OpenFolder(chosenFolder);
                LoadDirectory(chosenFolder); // 加载文件夹
            }
        }
    }



    private void open_specialFolderList_Click(object sender, RoutedEventArgs e)
    {
        string filePath = @"C:\YXB\specialFolderList.txt";

        try
        {
            // 如果文件不存在，创建空文件
            if (!File.Exists(filePath))
            {
                // 确保目录存在
                string dir = Path.GetDirectoryName(filePath);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                // 创建空文件
                File.WriteAllText(filePath, string.Empty);
            }

            // 调用 Windows 自带 Notepad 打开文件
            Process.Start(new ProcessStartInfo
            {
                FileName = "notepad.exe",
                Arguments = $"\"{filePath}\"",
                UseShellExecute = true
            });
        }
        catch (Exception ex)
        {
            MessageBox.Show("打开  C: YXB specialFolderList.txt 文件失败: " + ex.Message);
        }
    }




    
    // 加载文件夹
    public void LoadDirectory(string path)
    {
        FolderTreeView.Items.Clear();
        var root = new DirectoryInfo(path);
        FolderTreeView.Items.Add(CreateNode(root));
    }

    
    // 递归创建树形视图节点
    private readonly string[] hiddenPrefixes = new[] { "." };            // 以.开头的目录一律排除
    private readonly string[] excludedNames = new[] { "target", "cache" }; // 你自定义排除的目录名

    private TreeViewItem CreateNode(DirectoryInfo dir)
    {
        var node = new TreeViewItem
        {
            Header = dir.Name,
            Tag = dir.FullName,
            IsExpanded = true // 自动展开
        };

        try
        {
            // 遍历子目录
            foreach (var d in dir.GetDirectories())
            {
                // 目录名
                string dirName = d.Name;

                // ① 排除隐藏目录（以.开头）
                if (hiddenPrefixes.Any(p => dirName.StartsWith(p)))
                    continue;

                // ② 排除自定义目录名（忽略大小写）
                if (excludedNames.Any(n => string.Equals(dirName, n, StringComparison.OrdinalIgnoreCase)))
                    continue;

                node.Items.Add(CreateNode(d));
            }

            // 遍历文件
            foreach (var f in dir.GetFiles())
            {
                node.Items.Add(new TreeViewItem
                {
                    Header = f.Name,
                    Tag = f.FullName
                });
            }
        }
        catch
        {
            // 忽略没有访问权限的目录
        }
        return node;
    }



    // 处理文件夹树形视图（FolderTreeView）中选中项变更的事件  
    private void FolderTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (FolderTreeView.SelectedItem is TreeViewItem selectedItem)
        {
            string path = selectedItem.Tag as string;

            // 如果是文件，显示内容
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                try
                {
                    CodeEditor.Text = File.ReadAllText(path);
                    CodeEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(path));
                    currentFilePath = path; // 保存当前文件路径
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"无法读取文件: {ex.Message}");
                }
            }
        }
    }
    
    //  改进代码:   我希望文件树 目录全部自动展开 , 不需要一个一个手动点击展开目录   如何修改代码
    
    
    
    // =====================================================================================================
    // 保存文件
    private void SaveFileMenu_Click(object sender, RoutedEventArgs e)
    {
        SaveFile();
    }


    private void SaveFile()
    {
        if (!string.IsNullOrEmpty(currentFilePath))
        {
            try
            {
                // 检查文件是否存在
                if (!File.Exists(currentFilePath))
                {
                    MessageBox.Show($"文件不存在: {currentFilePath}");
                    return;
                }

                // 检查文件是否只读
                FileAttributes attributes = File.GetAttributes(currentFilePath);
                if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                {
                    var result = MessageBox.Show($"文件 '{Path.GetFileName(currentFilePath)}' 是只读的。是否要移除只读属性并保存？",
                        "只读文件", MessageBoxButton.YesNo, MessageBoxImage.Question);

                    if (result == MessageBoxResult.Yes)
                    {
                        // 移除只读属性
                        File.SetAttributes(currentFilePath, attributes & ~FileAttributes.ReadOnly);
                    }
                    else
                    {
                        return;
                    }
                }

                // 尝试保存文件
                File.WriteAllText(currentFilePath, CodeEditor.Text);
                MessageBox.Show("保存成功！");
            }
            catch (UnauthorizedAccessException)
            {
                MessageBox.Show($"没有权限写入文件: {currentFilePath}\n\n请检查：\n1. 文件是否被其他程序占用\n2. 是否有足够的权限访问该目录\n3. 尝试以管理员身份运行程序");
            }
            catch (DirectoryNotFoundException)
            {
                MessageBox.Show($"目录不存在: {Path.GetDirectoryName(currentFilePath)}");
            }
            catch (IOException ex)
            {
                MessageBox.Show($"文件I/O错误: {ex.Message}\n\n可能原因：\n1. 文件被其他程序占用\n2. 磁盘空间不足\n3. 文件路径过长");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存失败: {ex.Message}");
            }
        }
        else
        {
            MessageBox.Show("没有打开的文件可以保存");
        }
    }

    private void SaveAsFile()
    {
        if (string.IsNullOrEmpty(CodeEditor.Text))
        {
            MessageBox.Show("编辑器中没有内容可以保存");
            return;
        }

        var saveDialog = new Microsoft.Win32.SaveFileDialog()
        {
            Title = "另存为",
            Filter = "所有文件 (*.*)|*.*|文本文件 (*.txt)|*.txt|C# 文件 (*.cs)|*.cs|JavaScript 文件 (*.js)|*.js|HTML 文件 (*.html)|*.html|CSS 文件 (*.css)|*.css|XML 文件 (*.xml)|*.xml|JSON 文件 (*.json)|*.json",
            FilterIndex = 1
        };

        // 如果当前有打开的文件，使用其目录和文件名作为默认值
        if (!string.IsNullOrEmpty(currentFilePath))
        {
            saveDialog.InitialDirectory = Path.GetDirectoryName(currentFilePath);
            saveDialog.FileName = Path.GetFileName(currentFilePath);
        }

        if (saveDialog.ShowDialog() == true)
        {
            try
            {
                File.WriteAllText(saveDialog.FileName, CodeEditor.Text);
                currentFilePath = saveDialog.FileName; // 更新当前文件路径
                MessageBox.Show($"文件已保存到: {saveDialog.FileName}");
            }
            catch (UnauthorizedAccessException)
            {
                MessageBox.Show($"没有权限写入文件: {saveDialog.FileName}\n\n请选择其他位置或以管理员身份运行程序");
            }
            catch (DirectoryNotFoundException)
            {
                MessageBox.Show($"目录不存在: {Path.GetDirectoryName(saveDialog.FileName)}");
            }
            catch (IOException ex)
            {
                MessageBox.Show($"文件I/O错误: {ex.Message}\n\n可能原因：\n1. 文件被其他程序占用\n2. 磁盘空间不足\n3. 文件路径过长");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存失败: {ex.Message}");
            }
        }
    }
}





